require 'rubygems'
require 'json'

require File.dirname(__FILE__) + "/../common/ItemType"

# 検索レスポンス用データクラス： 予算・支出総額の複合一覧
class CompoundResult
  # コンストラクタ
  # @param {Budget[]} budgets データベースから取得した予算一覧（必要部分のみ）
  # @param {Outgoing[]} outgoings データベースから取得した支出一覧（必要部分のみ）
  def initialize(budgets, outgoings)
    # {ComponentResultItem[]} 複合結果一覧の実体
    @items = []
    
    itemHash = {}
    
    budgets.each do |budget|
      item = CompoundResultItem.new()
      item.budgetId = budget.id
      item.budgetName = budget.name
      item.budget = budget.value
      itemHash[budget.id] = item
    end
    
    outgoings.each do |outgoing|
      next if(itemHash.include?(outgoing.budgetId))
      itemHash[outgoing.budgetId].outgoing += value
    end
    
    itemHash.keys().sort{|x, y| x <=> y}.each do |budgetId|
      @items.push(itemHash[budgetId])
    end
    
  end
  
  # 検索結果を表すJSON文字列を生成する
  # TODO result とか response とかにまとめる処理は、どこかに一元化したい。appendResultTo を呼び出し側に移動させるか。
  def toJson()
    response = {}
    response["result"] = {}
    response["result"]["type"] = ItemType::COMPOUND
    response["result"]["rows"] = @items
    return JSON.dump(response)
  end
  
  # HTTPレスポンスに、検索結果を設定する
  # @param {HTTPResponse} クライアントに返す結果
  def appendResultTo(response)
    json = toJson()
    response.body = json
  end
end

# 収支複合一覧の各項目
class CompoundResultItem
  # {int} 予算項目識別子
  def budgetId
    @budgetId
  end
  
  # {String} 予算項目名
  def budgetName
    @budgetName
  end
  
  # {int} 予算金額
  def budget
    @budget
  end
  
  # {int} 支出総額
  def outgoing
    @outgoing
  end
end
